package com.huawei.zyb.taskManager.infrastructure.persistence.mapper;

import com.huawei.zyb.taskManager.infrastructure.persistence.po.TaskPO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 任务数据访问映射器
 */
@Mapper
public interface TaskMapper {
    
    /**
     * 插入任务
     */
    int insert(TaskPO taskPO);
    
    /**
     * 更新任务
     */
    int update(TaskPO taskPO);
    
    /**
     * 根据ID查找任务
     */
    TaskPO findById(@Param("id") Long id);
    
    /**
     * 根据需求ID查找任务列表
     */
    List<TaskPO> findByRequirementId(@Param("requirementId") Long requirementId);
    
    /**
     * 根据指派人ID查找任务列表
     */
    List<TaskPO> findByAssigneeId(@Param("assigneeId") String assigneeId);
    
    /**
     * 根据父任务ID查找子任务列表
     */
    List<TaskPO> findByParentTaskId(@Param("parentTaskId") Long parentTaskId);
    
    /**
     * 根据状态查找任务列表
     */
    List<TaskPO> findByStatus(@Param("status") String status);
    
    /**
     * 根据层级查找任务列表
     */
    List<TaskPO> findByLevel(@Param("level") String level);
    
    /**
     * 查找所有任务
     */
    List<TaskPO> findAll();
    
    /**
     * 根据ID删除任务
     */
    int deleteById(@Param("id") Long id);
    
    /**
     * 检查任务是否存在
     */
    boolean existsById(@Param("id") Long id);
    
    /**
     * 检查是否有未完成的子任务
     */
    boolean hasIncompleteSubTasks(@Param("parentTaskId") Long parentTaskId);
    
    /**
     * 根据父任务ID查找所有子任务（非递归）
     */
    List<TaskPO> findAllSubTasks(@Param("parentTaskId") Long parentTaskId);
    
    /**
     * 根据父任务ID递归查找所有子任务
     */
    List<TaskPO> findAllSubTasksRecursively(@Param("parentTaskId") Long parentTaskId);
    
    /**
     * 批量更新任务状态
     */
    int batchUpdateStatus(@Param("taskIds") List<Long> taskIds, 
                         @Param("status") String status,
                         @Param("updatedAt") LocalDateTime updatedAt);
    
    /**
     * 根据需求ID和状态查找任务
     */
    List<TaskPO> findByRequirementIdAndStatus(@Param("requirementId") Long requirementId, 
                                             @Param("status") String status);
    
    /**
     * 统计任务数量
     */
    int countByStatus(@Param("status") String status);
    
    /**
     * 根据指派人ID统计任务数量
     */
    int countByAssigneeId(@Param("assigneeId") String assigneeId);
    
    /**
     * 统计总任务数
     */
    long count();
    
    /**
     * 根据优先级统计任务数
     */
    long countByPriority(@Param("priority") String priority);
}